package org.iot.iotserver.netty.config;

import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.AttributeKey;
import io.netty.util.concurrent.GlobalEventExecutor;
import org.iot.iotserver.netty.entity.ADevice;
import org.iot.iotserver.netty.entity.DefaultDevice;

import java.util.Arrays;
import java.util.List;

/**
 * 全局常量
 */
public class NettyConstant {

    /**
     * 设备状态相关常量
     */
    public static class DeviceStatus {

        /**
         * 有效状态
         */
        public static final int ACTIVE = 0x01;

        /**
         * 失效状态
         */
        public static final int IN_ACTIVE = 0x00;
    }

    /**
     * 心跳超时时间, 单位: ms
     */
    public static final long HEART_BEAT_TIMEOUT = 30 * 1000;

    /**
     * 单片机设备 KEY, Channel 里面有此 KEY 才能代表该设备已经登录
     */
    public static final AttributeKey<Object> DEVICE_KEY = AttributeKey.valueOf("DEVICE_NAME");

    /**
     * 保存 netty 服务器所有的 channel 信息, 规定只能 Service 才能对其进行操作
     */
    public static final ChannelGroup CHANNELS = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    /**
     * 规定合法的远程设备名称, 其他设备上送数据一律不接收
     */
    public static final List<String> LEGAL_DEVICE_NAMES = Arrays.asList("test-01");

    /**
     * 需要权限的设备端需要附带其中包含的 ID 作为认证信息
     */
    public static final List<String> LEGAL_MONITORS = Arrays.asList("yangxiuchu666");

    /**
     * 设备信息缓存
     */
    public static final TimedCache<String, ADevice> DEVICE_CACHE = CacheUtil.newTimedCache(3650 * 24 * 60 * 60 * 1000);

    static {
        // 10 年
        DEVICE_CACHE.schedulePrune(3650 * 24 * 60 * 60 * 1000);
        // 根据 LEGAL_DEVICE_NAMES 信息初始化所有设备信息
        LEGAL_DEVICE_NAMES.forEach(name -> {
            ADevice device = new DefaultDevice();
            device.setId(name);
            device.setStatus(DeviceStatus.IN_ACTIVE);
            DEVICE_CACHE.put(name, device);
        });
    }
}
